<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        //浅拷贝 深拷贝
        //基础数据类型:String Number Null Undefined Boolean;浅拷贝 栈内存中存储
        //引用数据类型:Object Array Function;深拷贝 堆内存中存储 (隐藏指针JS特有)

        // let a = 10;
        // let b = a;
        // b = 20;
        // console.log(a, ':', b);

        //最后a的值是10, b的值是20 因为把a的值赋值给b是把变量a内存地址里储存的值赋值给b 所以修改b的值 a不会改变内存地址里的值


        // 复杂数据类型出现引用问题 
        // 浅拷贝
        // let a = {
        //     num:10
        // }
        // let b = a;
        // b.num = 20;
        // console.log(a);

        // 如何解决 复杂数据类型的引用问题？？深拷贝
        // 1.json
        // let a = {
        //     num:10,
        //     fn:function(){
        //         console.log(111);
        //     },
        //     c:undefined
        // }
        // // 深拷贝，会忽略 undefined 以及 函数属性
        // let b =  JSON.parse(JSON.stringify(a));
        // b.num = 20;
        // console.log(a);
        // console.log(b);

        // 2.通过递归来实现深拷贝
        // let a = {
        //     num:10,
        //     arr:[1,2,3],
        //     obj:{
        //         age:20
        //     },
        //     fn(){
        //         console.log("fn")
        //     },
        //     c:undefined
        // }

        // function deepCopy(obj){
        //     // 判断obj是对象还是数组 
        //     // 内存里是新的空间
        //     let newRes = Array.isArray(obj)?[]:{};
        //     for(let key in obj){
        //         if(obj.hasOwnProperty(key)){
        //         if(typeof obj[key] != "object"){
        //             newRes[key] = obj[key];
        //         }else{
        //             //newRes ['obj']=  {age:20}
        //             newRes[key] = deepCopy(obj[key]); 
        //         }
        //     }
        //     }
        //     return newRes;
        // }
        // let b = deepCopy(a);
        // // let b = a;
        // // console.log(b);
        // b.num = 30;
        // console.log(a);

        // let arr = [1,2,3];
        // for(let key in arr){
        //     console.log(val);
        // }

        // for in  ：循环原型链

        // Object.prototype.myheight = "180cm";

        // let obj = {
        //     name:"123",
        //     age:30
        // }
        // obj.__proto__.height = "178cm";

        // for(let key in obj){
        //     // 判断某个属性是否是自身属性
        //     if(obj.hasOwnProperty(key)){
        //         console.log(obj[key]);
        //     }
        // }

        // 跨域 ：浏览器安全策略 ，同源之间访问 协议 域名 端口 
        // 跨域是单纯地浏览器行为 。http://localhost:8989--->http://localhost:8080
        // 如何解决 ： jsonp 、服务器代理 （正向服务器 、反向服务器代理nignx） 、cors（设置返还头部）：跨域资源共享 预检请求 
        // postMessage、websocket

        // var let const 区别 
        // var 全局作用域  变量提升 hosting
        // console.log(a);
        // var a = 10;
        // let a = 10;
        // console.log(a);
        // let a = 10;
        //  a = 20;
        // console.log(a);
        // const PI = 3.14;
        // PI = 3.15;

        // let 和const 支持 块级作用域
        // {
        //     var a = 10;
        //     console.log(a);
        // }

        // console.log(a);

        // 自执行函数
        // (function(){
        //     var a = 10;
        //     console.log(a);
        // })()
        // console.log(a);

    </script>
</body>

</html>